home *** CD-ROM | disk | FTP | other *** search
- ;/* trap_c.c - Execute me to compile me with SAS C 5.10
- LC -b0 -cfistq -v -y -j73 trap_c.c
- Blink FROM LIB:c.o,trap_c.o,trap_a.o TO trap LIBRARY LIB:LC.lib,LIB:Amiga.lib
- quit
-
- trap_c.c - C module of sample integer divide-by-zero trap
- */
- #include <exec/types.h>
- #include <exec/tasks.h>
- #include <clib/exec_protos.h>
- #include <stdlib.h>
- #include <stdio.h>
-
- #ifdef LATTICE
- int CXBRK(void) { return(0); } /* Disable Lattice CTRL/C handling */
- int chkabort(void) {return(0); }
- #endif
-
- extern ULONG trapa(); /* assembler trap code in trap_a.asm */
-
- APTR oldTrapCode;
- ULONG countdiv0;
-
- void main(int argc, char **argv)
- {
- struct Task *thistask;
- ULONG k,j;
-
- thistask = FindTask(NULL);
-
- /* Save our task's current trap code pointer */
- oldTrapCode = thistask->tc_TrapCode;
-
- /* Point task to our assembler trap handler code. Ours will just count */
- /* divide-by-zero traps, and pass other traps on to the normal TrapCode */
- thistask->tc_TrapCode = (APTR)trapa;
-
- countdiv0 = 0L;
-
- for(k=0; k<4; k++) /* Let's divide by zero a few times */
- {
- printf("dividing %ld by zero... ",k);
- j = k/0L;
- printf("did it\n");
- }
- printf("\nDivide by zero happened %ld times\n",countdiv0);
-
- thistask->tc_TrapCode = oldTrapCode; /* Restore old trap code */
- }
-
-
-
- * trap_a.asm - Example trap handling code (leaves D0 intact). Entered
- * in supervisor mode with the following on the supervisor stack:
- * 0(sp).l = trap#
- * 4(sp) Processor dependent exception frame
-
- INCLUDE "exec/types.i"
- INCLUDE "libraries/dos.i"
-
- XDEF _trapa
- XREF _countdiv0
- XREF _oldTrapCode
-
- CODE
- _trapa: ; our trap handler entry
- CMPI.L #5,(SP) ; is this a divide by zero ?
- BNE.S notdiv0 ; no
- ADD.L #1,_countdiv0 ; yes, increment our div0 count
- endtrap:
- ADDQ #4,SP ; remove exception number from SSP
- RTE ; return from exception
- notdiv0:
- TST.L _oldTrapCode ; is there another trap handler ?
- BEQ.S endtrap ; no, so we'll exit
- MOVE.L _oldTrapCode,-(SP) ; yes, go on to old TrapCode
- RTS ; jumps to old TrapCode
-
- END
-